00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #ifndef DEOCTREE_HPP
00029 #define DEOCTREE_HPP
00030
00031 #include "deGlobalTypes.hpp"
00032 #include "deScene.hpp"
00033 #include "deList.hpp"
00034
00035 #if defined(DESCENE_DLL_EXPORTS) || defined(DESTINY3D_EXPORT_ALL)
00036 # define DEOCTREE_API DEDLL_EXPORT
00037 #elif defined(DESTINY3D_STATIC_LINK)
00038 # define DEOCTREE_API
00039 #else
00040 # define DEOCTREE_API DEDLL_IMPORT
00041 #endif
00042
00043 class IdeVertexBuffer;
00044
00045 class deSceneOctree
00046 {
00047 protected:
00048 virtual ~deSceneOctree();
00049
00050 public:
00051 deSceneOctree();
00052 int Release();
00053
00054 void TEST();
00055
00056 void SetMinOctSize(deDouble MinSize);
00057 deDouble GetMinOctSize();
00058 void SetMaxNodeNum(int MaxNum);
00059 int GetMaxNodeNum();
00060
00061 IdeVertexBuffer * GetVB(int MaxPoints);
00062
00063 deBoolean WipeTree();
00064
00065 deBoolean AddNode(IdeSceneRoom * Node);
00066 deBoolean RemoveNode(IdeSceneRoom * Node);
00067
00068 IdeSceneRoom * FindContainerNode(const deVec3d &Position);
00069 IdeSceneRoom * FindClosestNode(const deVec3d &Position);
00070 deBoolean FindIntersectingNodes(deTList <IdeSceneRoom*> &List, const deVec3d * Mins, const deVec3d * Maxs);
00071
00072 deBoolean TraceRayCollision(const deVec3d & Start, const deVec3d & End, IdeCollision::deCollideInfo & Collision);
00073
00074 void CleanUp();
00075
00076 private:
00077 enum Neighbor_t
00078 {
00079 n_None = -1,
00080 n_Left = 0,
00081 n_Right,
00082 n_Bottom,
00083 n_Top,
00084 n_Front,
00085 n_Back,
00086 };
00087 struct Octant
00088 {
00089 Octant* Parent;
00090 int ParentIndex;
00091 int NeighborRefs;
00092 Octant* Child[8];
00093 Octant* Neighbor[6];
00094 deTList <IdeSceneRoom*> FixedNodes;
00095 deTList <IdeSceneRoom*> AddedNodes;
00096 deVec3d Min, Max, Center;
00097 deBoolean CanBeRemoved;
00098 int TestNumber;
00099 };
00100
00101 Octant * m_Root;
00102
00103 deDouble m_MinSize;
00104
00105 int m_MaxNodes;
00106
00107 int m_TestNumber;
00108
00109 IdeVertexBuffer * m_LineListVB;
00110
00111 deBoolean FillOctantLinePoints(Octant * oct, deVertex * Buffer, int & LastPoint, int MaxPoints);
00112
00113 void CleanUp(Octant * oct);
00114 deBoolean SubdivideOctant(Octant * oct);
00115 deBoolean Optimize(Octant * oct);
00116 deBoolean InsertNode(IdeSceneRoom * Node);
00117
00118 deBoolean CalcNeighbors(Octant * oct);
00119 Octant* TraceNeighbor(Octant * Start, Octant * Current, Neighbor_t N, int Depth);
00120
00121 deBoolean RayTestFromOctant(Octant * oct, const deVec3d & Start, const deVec3d & End, IdeCollision::deCollideInfo & Collision);
00122 deBoolean RayTestNodes(Octant * oct, const deVec3d & Start, const deVec3d & End, IdeCollision::deCollideInfo * Collision);
00123 deBoolean RayTestParents(Octant * oct, const deVec3d & Start, const deVec3d & Dir, IdeCollision::deCollideInfo * Collision);
00124 Neighbor_t RayToNeighbor(Octant * oct, const deVec3d & RayStart, const deVec3d & RayDir, deVec3d & ExitPoint);
00125 int DecideChildOctant(Octant * Parent, const deVec3d & Position);
00126 int DecideParentOctant(Octant * Child, const deVec3d & Position);
00127
00128 deBoolean InitializeRoot();
00129 Octant * MakeOctant(const deVec3d &Min, const deVec3d &Max, Octant * ParentChild, int ParentID);
00130 Octant * MakeSubOctant(Octant * ParentChild, int ParentID);
00131
00132 deBoolean RemoveOctant(Octant * oct, deTList <IdeSceneRoom*> * DumpList, deBoolean RemoveChildren, deBoolean IgnoreNeighbors = deFALSE);
00133
00134 Octant * FindOctant(const deVec3d &Position);
00135 Octant * FindSubOctant(Octant * oct, const deVec3d &Position);
00136 Octant * FindOctant(const deVec3d &Min, const deVec3d &Max);
00137 Octant * FindSubOctant(Octant * oct, const deVec3d &Min, const deVec3d &Max);
00138
00139 deBoolean TestOctantPoint(Octant * oct, const deVec3d &Position);
00140 deBoolean TestOctantBBox(Octant * oct, const deVec3d &Min, const deVec3d &Max);
00141 };
00142
00143 #endif